package ru.nstu.isma.core.lang;

import ru.nstu.isma.core.lang.ast.LismaLexer;
import ru.nstu.isma.core.lang.ast.LismaParser;
import ru.nstu.isma.core.hsm.HMModel;
import ru.nstu.isma.core.lang.semantic.ASTTreeTranslator;
import ru.nstu.isma.core.lang.error.ErrorList;
import ru.nstu.isma.core.lang.error.LismaErrorListener;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;

/**
 * User: abv
 * Date: 05.12.13
 * Time: 13:11
 */
public class Text2HSMTranslator {

    public static HMModel translate(String text, ErrorList errors) {
        HMModel model;

        // объект входной текстовой модели
        CharStream cs = new ANTLRInputStream(text);
        // лексер
        LismaLexer lexer = new LismaLexer(cs);
        // разбираем в поток токенов
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        // парсим в синтаксическое дерево
        LismaParser parser = new LismaParser(tokens);
        LismaErrorListener errorListener = new LismaErrorListener(errors);
        parser.addErrorListener(errorListener);
        LismaParser.LismaContext tree = parser.lisma();
        // преобразователь из дерева в объектную модель HMS
        ASTTreeTranslator ast2HSM = new ASTTreeTranslator(tree);
        model = ast2HSM.parse();

        return model;
    }
}
